home *** CD-ROM | disk | FTP | other *** search
- program PhotoFilter(input,output);
-
- (* Here is the raw file data type produced by the Photoshop program *)
-
- type
- image = array [0..250] of array [0..255] of byte;
-
- (* The variables we will use. Note that the "datain" and "dataout" *)
- (* variables are pointers because Turbo Pascal will not allow us to *)
- (* allocate more than 64K data in the one global data segment it *)
- (* supports. *)
-
- var
- h,i,j,k,l,sum,iterations:integer;
- datain, dataout: ^image;
- f,g:file of image;
-
- begin
-
- (* Open the files and real the input data *)
-
- assign(f, 'roller1.raw');
- assign(g, 'roller2.raw');
- reset(f);
- rewrite(g);
- new(datain);
- new(dataout);
- read(f,datain^);
-
- (* Get the number of iterations from the user *)
-
- write('Enter number of iterations:');
- readln(iterations);
-
- writeln('Computing result');
-
- (* Copy the data from the input array to the output array. *)
- (* This is a really lame way to copy the border from the *)
- (* input array to the output array. *)
-
- for i := 0 to 250 do
- for j := 0 to 255 do
- dataout^ [i][j] := datain^ [i][j];
-
- (* Okay, here's where all the work takes place. The out- *)
- (* side loop repeats this blurring operation the number of *)
- (* iterations specified by the user. *)
-
- for h := 1 to iterations do begin
-
- (* For each row except the first and the last, compute *)
- (* a new value for each element. *)
-
- for i := 1 to 249 do
-
- (* For each column except the first and the last, com- *)
- (* pute a new value for each element. *)
-
- for j := 1 to 254 do begin
-
- (* For each element in the array, compute a new *)
- (* blurred value by adding up the eight cells *)
- (* around an array element along with eight times *)
- (* the current cell's value. Then divide this by *)
- (* sixteen to compute a weighted average of the *)
- (* nine cells forming a square around the current *)
- (* cell. The current cell has a 50% weighting, *)
- (* the other eight cells around the current cell *)
- (* provide the other 50% weighting (6.25% each). *)
-
- sum := 0;
- for k := -1 to 1 do
- for l := -1 to 1 do
- sum := sum + datain^ [i+k][j+l];
-
- (* Sum currently contains the sum of the nine *)
- (* cells, add in seven times the current cell so *)
- (* we get a total of eight times the current cell. *)
-
- dataout^ [i][j] := (sum + datain^ [i][j]*7) div 16;
-
- end;
-
- (* Copy the output cell values back to the input cells *)
- (* so we can perform the blurring on this new data on *)
- (* the next iteration. *)
-
- for i := 0 to 250 do
- for j := 0 to 255 do
- datain^ [i][j] := dataout^ [i][j];
-
- end;
-
- writeln('Writing result');
- write(g,dataout^);
- close(f);
- close(g);
-
- end.
-
-
-